package jdk8.optional;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class OptionalDemo {

	public static void main(String[] args) {
		//假设我们通过某个方法来获取了一个对象
		List<String> strList = getNames();
		//早期的写法
		if(null != strList) { //一定要做非空判断，防止 NPE [NullPointerException] 的产生
			strList.forEach(System.out::println);
		} else {
			System.out.println("集合对象为null");
		}
		//JDK8, 使用 Optional 
		System.out.println("-------------- 使用 Optional -------------------");
		//1. 调用Optional提供的工厂方法，把 目标对象封装成 Optional对象
		Optional<List<String>> opt = Optional.ofNullable(strList);
		
		//2.可以通过 Optional中提代的方法来完成业务
		opt.ifPresent((list) -> list.forEach(System.out::println));
		// 注： 下面的代码中的 Consumer接口的实现与上面 不一样在哪里？
		opt.ifPresent(System.out::println); //相当于： (list) -> System.out.println(list)
		
		// 下面的代码，虽然是使用了 Optional，但是，这个逻辑不好，因为与传统的方法调用并无不同，而且还多包装了一层，性能更低。
		/** 
		if(opt.isPresent()) { //相当于： if(strList != null)
			opt.get().forEach(System.out::println);
		} else {
			System.out.println("集合对象为null");
		}
		*/
		
		//
		Optional<Integer> intOpt = Optional.of(100);
		System.out.println(intOpt.get());
		System.out.println(intOpt.orElse(200)); //返回的就是 T，不是 Optional<T>
		System.out.println(intOpt.orElseGet(() -> 200)); //返回的就是 T
	}

	
	//
	private static List<String> getNames() {
		//
		if(Math.random() < 0.5) {
			return Arrays.asList("jack","smith","ann","peter","solo");
		} else {
			return null;
		}
	}
}
